#pragma once
#include <list>
#include <string>
#ifdef DLL_SAMPLE_EXPORTS
#define DLL_API __declspec(dllexport)
#else
#define DLL_API __declspec(dllimport)
#endif
using namespace std;
class Figure
{
    public:
    virtual string figure() = 0;
    virtual list<int> get_list_coordinates() = 0;

    virtual void move(int& tmp_x, int& tmp_y) = 0;
};

class DLL_API Make_Figure
{
    std::list<Figure*> any_figure;
    public:
    ~Make_Figure();
    void   push_back(Figure* figure);
    void  pop_back(int* number);
    void   move_figure(int& find_figure, int& x, int& y);
    void   writeFile(string name);
    void  load_file();
};
class DLL_API triangle : public Figure
{
    list<int> x;
    list<int> y;
    public:
    void move(int& tmp_x, int& tmp_y);
    triangle(list<int>& set_x, list<int>& set_y);
    string figure();
    list<int> get_list_coordinates();
};

class DLL_API circle :public Figure
{
    int x_CIRCLE;
    int y_CIRCLE;
    int r_CIRCLE;
    public:
    circle(int* set_x, int* set_y, int* set_r);
    void move(int& tmp_x, int& tmp_y);
    list<int> get_list_coordinates();
    string figure();
};
class DLL_API rectangle :public Figure
{
    list<int> x;
    list<int> y;
    public:
    void move(int & tmp_x, int & tmp_y);
    rectangle(list<int>& set_x, list <int>& set_y);
    list<int> get_list_coordinates();
    string figure();
};